Amazon SNS Extended Client Library for Python を使って、256 KB を超えるペイロードを処理させてみた

Amazon SNS Extended Client Library for Python を使って、256 KB を超えるペイロードを処理させてみた

Clock Icon2023.03.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、森田です。

以下のアップデートにあるように、Python 用の Amazon SNS 拡張クライアントライブラリが公開されました。

このライブラリを利用することで Amazon SNS で 256KB以上のペイロードを処理できるようになります。

本記事では、実際にこのライブラリを使って動作を見ていきたいと思います。

はじめに

このライブラリを使用することで、Amazon SNS の制限値が増えるわけではなく、制限値以上のペイロードを扱えるように内部で処理してくれます。

具体的には、Amazon SNS で 256 KB を超えるペイロードを処理できるように、S3にペイロード情報を保存して、S3の参照先を Amazon SNSのペイロードとしているようです。

実際にライブラリを使ってその仕様を確認してみます。

やってみた

事前準備

まずは、ライブラリを以下のコマンドでインストールします。

pip install amazon-sns-extended-client

SNS トピックの作成

続いて、送信するSNSトピックを準備します。

タイプはスタンダードとして選択し、他はデフォルトの状態で作成します。

動作確認のため、作成した SNSトピックにサブスクリプションをEメールで作成します。

S3 バケットの作成

ペイロードを保存するS3バケットを作成します。

こちらもデフォルトの設定で作成します。

SNS トピックへの送信

SNS トピックへ送信するためのコードを作成します。

以下のコードでは、画像データ(256KB以上)を読み込み、base64エンコードしたものをペイロードとしています。

import boto3
import base64
import sns_extended_client
import json 


sns = boto3.client('sns')
sns.large_payload_support = '作成したS3バケット'


# 画像ファイルを開いて、バイナリモードで読み込む
with open("sample.jpg", "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read()).decode("utf-8")

data = json.dumps({'image': encoded_string})


topic_arn = "作成したSNSトピックのArn"

response = sns.publish(
        TopicArn=topic_arn,
        Message=data,
        Subject="TEST"
        )

print("response is {}".format(response))

上記のコードを見ていただければわかるように、

  • import sns_extended_client
  • sns.large_payload_support = '作成したS3バケット'

を設定するだけ簡単に実装できます。

あとは、上記のスクリプトを実行してみると、以下のようにペイロードとして、S3のパスなどが登録したメールアドレスに送信されます。

ちなみに、256KB以下のファイル送った場合は、S3を使用せず、以下のようにそのままのデータが送信されます。

デフォルトでは、S3を使った送信とするか、そのままのデータで送信するかの閾値として256KBとなっていますが、

パラメータを指定することで、全てS3を使った送信とすることや任意の閾値とすることも可能です。

sns.always_through_s3 = True
sns.message_size_threshold = 65536

最後に

SNS 拡張クライアントライブラリを触ってみましたが、たった数行で256 KB を超えるペイロードを処理できるため、とても便利だと感じました。

実際には、送信したペイロードの実データはS3上に保存されているので、サブスクリプション側でデータを読み込みたい場合などは、S3 Get Objectをする必要がありそうです。

 

 

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.